/*
 * CrearAutomata
 * 
 * Version 
 *
 * 27/09/2013
 * 
 * Licencia
 */
package proyecto2.logica;

import java.io.File;
import java.util.ArrayList;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class CrearAutomata {

    org.w3c.dom.Document miDoc;
    NFA automata;

    public CrearAutomata(String file) {
        automata = new NFA(new ArrayList<Estado>());
        File f = new File(file);
        LectorXML miLector = new LectorXML(f);
        miDoc = miLector.getDocument();
        automata.setEstados(crearEstados());
        automata.setAlfabeto(crearAlfabeto());
        automata.setTransiciones(crearFunciones());
        setInicial();
        setFinales(); 
        
        

    }

    
    public NFA getAutomata() {
        return automata;
    }

    private ArrayList<Estado> crearEstados() {
        ArrayList<Estado> estados = new ArrayList<>();
        NodeList lista = miDoc.getElementsByTagName("states").item(0).getChildNodes();
        for (int i = 0; i < lista.getLength(); i++) 
            if (lista.item(i).getNodeType() == Node.ELEMENT_NODE) {
                estados.add(new Estado(lista.item(i).getTextContent(), false, false));
                //System.out.println("->"+lista.item(i).getTextContent());
            }
        return estados;
    }

    private ArrayList<String> crearAlfabeto() {
        ArrayList<String> alfabeto = new ArrayList<>();
        NodeList lista = miDoc.getElementsByTagName("alphabet").item(0).getChildNodes();
        for (int i = 0; i < lista.getLength(); i++) 
            if (lista.item(i).getNodeType() == Node.ELEMENT_NODE)
                alfabeto.add(lista.item(i).getTextContent());
               // System.out.println("->"+lista.item(i).getTextContent());                
           
        
        return alfabeto;
    }

    private ArrayList<Transicion> crearFunciones() {
        ArrayList<Transicion> transiciones = new ArrayList<>();
            NodeList lista = miDoc.getElementsByTagName("transitions").item(0).getChildNodes();
        NodeList lista1;
        for (int i = 0; i < lista.getLength(); i++){ 
            if (lista.item(i).getNodeType() == Node.ELEMENT_NODE) {
                lista1 = lista.item(i).getChildNodes();
                Transicion tr = new Transicion();
                for (int j = 0; j < lista1.getLength(); j++){ 
                     if (lista.item(j).getNodeType() == Node.ELEMENT_NODE) { 
                         String nodeName = lista1.item(j).getNodeName();
                         String textContent = lista1.item(j).getTextContent();
                        if(nodeName.equals("source")){
                            tr.setOrigen(buscarEstado(textContent));
                            //System.out.println("1"+textContent);
                        } else if(nodeName.equals("char")) {
                            tr.setVariable(textContent);
                            //System.out.println("2"+textContent);
                        } else if(nodeName.equals("destiny")) {
                            tr.setDestino(buscarEstado(textContent));
                            //System.out.println("3"+textContent);
                        }
                     }
                }
                transiciones.add(tr);
            }
        }
        return transiciones;
    }
    
    private Estado buscarEstado(String name) {
        Estado e = null;
        for(Estado aux:automata.getEstados())
            if(aux.getId().equals(name))
                 e = aux;
        return e;
                
   }
    
   private void setInicial() {
       String ei = miDoc.getElementsByTagName("initial-state").item(0).getTextContent();
       buscarEstado(ei).setES_INICIAL(true);
       automata.setInicial(buscarEstado(ei));
   }
   
   private void setFinales() { 
        NodeList lista = miDoc.getElementsByTagName("final-states").item(0).getChildNodes();
        for (int i = 0; i < lista.getLength(); i++) {
            if (lista.item(i).getNodeType() == Node.ELEMENT_NODE){
                buscarEstado(lista.item(i).getTextContent()).setES_FINAL(true);
                automata.getFinales().add(buscarEstado(lista.item(i).getTextContent()));
            }
        
        }
   }
           
   
   
   
}
